package com.cskaoyan.javase.method._0introduction;

/**
 * 使用方法来复用代码
 * 方法的语法:
 * [修饰符列表] 返回值类型 方法名 (形式参数列表){
 *   // 方法体
 * }
 * 两个名词:
 * 1.方法的声明(也叫方法头),"[修饰符列表] 返回值类型 方法名 (形式参数列表)"共同组成的结构
 *      称之为方法的声明(也叫方法头)
 * 2.方法的签名,"方法名 (形式参数列表)"组合起来称之为"方法的签名"
 *
 * 逐一解释:
 * 1.修饰符列表：指的是方法能够使用的修饰符所组成的列表,其实就是关键字的合集.
 *      目前,我们没有学习方法的修饰符,先默认是public static(和main方法保持一致)
 *      对于方法而言,修饰符不是必须的,可以允许没有任何修饰符.
 *
 * 2.返回值类型：方法可能会有结果，这个结果就是返回值，返回值的数据类型称之为返回值类型
 *          返回值类型可以是基本数据类型，也可以是引用数据类型（例如String）
 *          但是Java方法最多只能返回一个返回值,不可以直接返回多个值.
 *
 * 3.方法名：给方法起个名字，调用方法时用的，方法名的命名需要遵守规范
 *      必须是合法的标识符
 *      方法名最好见名知意
 *      方法名最好是动词
 *      方法名遵循首字母小写，其他单词的首字母大写的小驼峰命名法
 *      强调:
 *          给方法起名字的时候,特别要注意"见名知意"
 *          方法的名字一定要对应方法的作用,不要瞎起名字
 *          比如一个方法是用来求最大值,它就叫"getMaxValue"
 *          尤其不要使用"a,b,c,d.."这种毫无意义的字符串起名字
 *
 * 4.形式参数列表: 指的是由形式参数组成的列表,注意方法不是必须要有形式参数列表,可以为空.
 *      形式参数: 方法在实现功能时，有时需要传入数据方法在定义时就应该告诉方法的调用者应该传入什么数据
 *          传入几个数据
 *          这些都是根据形式参数给出的,简称形参.
 *          并且参数传入方法后,还需要在方法内部被使用,所以形参还需要给出一个名字
 *          那么形参的语法就是:
 *              数据类型 形参名
 *
 *          形参可以是基本数据类型变量，也可以是引用数据类型变量
 *          形参的个数不受限，多个形参之间用逗号隔开
 *          形参的作用域仅在方法内部，它们都是局部变量
 *          形参列表实际只是一个占位符，并不是一个真正的参数。是一个形式.
 *
 *          调用方法时传入的具体数据参数称之为实际参数，简称实参,实参是一个真正的参数.
 *
 * 5.方法体：方法体包含具体的语句，定义该方法的功能，由大括号包裹起来。
 *
 * 方法的定义:
 * 1.方法的语法讲完了,那么方法应该在哪里定义呢?
 *  在类体中,其它方法的方法体外部定义
 *  Java中的方法是不能嵌套定义的
 *
 * 2.如果一个方法,在定义时,明确指出了返回值的数据类型
 * 那么在方法体中就应该直接指出返回值是什么
 * 语法:
 *      return + 返回值
 * 注:
 *      返回值可以直接写一个数值
 *      也可以直接写一个表达式
 *      反正只要能够对应上返回值类型就可以了
 *
 * 方法的调用
 * 1.方法不调用不执行,一段代码,一个方法如果想要执行
 * 就必须直接或间接的在main方法中被执行,被调用
 *
 * 2.在同一个类当中,修饰符列表中有static修饰的方法
 * 可以直接在main方法中,使用方法名(实参列表)去调用它.
 *
 * 3.对于有返回值,有结果的方法,建议接收和使用方法的返回值
 * 4.(重点)具有返回值的方法可以操作它们的方法调用
 * 操作它们的方法调用,就是操作返回值
 *
 * 注意事项:
 *      1.Java一个类中的多个方法是平行的关系
 *      不管定义在什么位置,位置不影响调用结果.
 *
 *      2.方法形参定义的变量是一个局部变量
 *      仅在方法内部类生效
 *
 *      3.同一个类中,修饰符列表中存在static的方法
 *      它们之间可以互相调用
 *      而且调用方式就是直接写:
 *      方法名(实参列表);
 *
 * @since 15:59
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class NewDemo {
    public static void main(String[] args) {
        // Result of 'NewDemo.sumIntValue()' is ignored
        // sumIntValue(10, 10);
        int sum = sumIntValue(10, 10);
        System.out.println(sumIntValue(20, 20));
        System.out.println(sumIntValue(30, 30) + 30);
        System.out.println(sumIntValue(30, 30) / 10);

        System.out.println(getString());
        System.out.println(getString() + " world!");
        System.out.println(getString().length());

        int num1 = 100;
        int num2 = 200;
        System.out.println(sumIntValue(num1, num2));

    }

    // 需求: 求两个int参数的和
    public static int sumIntValue(int num1, int num2) {
        // Missing return statement
        // Local variable 'sumValue' is redundant
        /*int sumValue = num1 + num2;
        return sumValue;*/
        System.out.println(getString());
        return num1 + num2;
    }

    // 无参方法,意味着调用无需传参
    public static String getString() {
        return "hello";
    }

}

